
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

static char _arquivoEspecies[50] = "files/especies.txt";
static char _arquivoIndividuos[50] = "files/individuos.txt";
static char _arquivoCapturas[50] = "files/capturas.data";
//int localLinha, loc, pos;

void str_replace(char * original){
	char * pch;
	pch = strstr (original,"\n");
	strncpy (pch,"\0",2);
	puts (original);
}

void InserirEspecie(char *id, char *nomeCientifico, char *nomePopular, char *descricao) {
	FILE *arquivo;
	arquivo = fopen (_arquivoEspecies, "a");
	char registro[500] = "";
	sprintf(registro, "\n%s|%s|%s|%s", id, nomeCientifico, nomePopular, descricao);
	fputs(registro, arquivo);
	fclose(arquivo);
}

void InserirIndividuo(char *IdEspecie, char *IdIndividuo,char *Sexo) {
	FILE *arquivo;
	arquivo = fopen (_arquivoIndividuos, "a");
	char registro[10000] = "";
    sprintf(registro,"\n%s|%s|%s",IdEspecie,IdIndividuo,Sexo);
    // tamanho maximo do registro 10000
    if (sizeof(registro) > 10000) {
    	exit(0);
    }
	fputs(registro, arquivo);
	fclose(arquivo);
}

void InserirCaptura(char *IdCaptura, char *IdIndividuo,char *Comprimento, char *Largura, char *Peso, char *Data, char *Local) {
	FILE *arquivo;
	arquivo = fopen (_arquivoEspecies, "a");
	char registro[10000] = "";
	sprintf(registro,"\n%s|%s|%s|%s|%s|%s|%s",IdCaptura,IdIndividuo,Comprimento, Largura, Peso, Data, Local);
	fputs(registro, arquivo);
	fclose(arquivo);
}

void Inserir(char *tipo) {
	system("cls");
	printf("---------------------------------------------------\n");
	printf("  ********* Inserir %s *********\n", tipo);
	printf("---------------------------------------------------\n");
	char especie[] = "Especies";
	if (strcmp(tipo, especie) == 0) {
		printf("ID: ");
		char idEspecie[200];
		scanf("%s",idEspecie);

		printf("Nome cientifico: ");
		char nomeCientificoEspecie[200];
		scanf("%s",nomeCientificoEspecie);

		printf("Nome popular: ");
		char nomePopularEspecie[200];
		scanf("%s",nomePopularEspecie);

		printf("Descricao: ");
		char descricaoEspecie[200];
		scanf("%s",descricaoEspecie);

		InserirEspecie(idEspecie, nomeCientificoEspecie, nomePopularEspecie, descricaoEspecie);
	}
	char individuo[] = "Individuos";
	if (strcmp(tipo, individuo) == 0) {
		printf("ID da Especie: ");
		char IdEspecie[200];
		scanf("%s",IdEspecie);

		printf("ID do Individuo: ");
		char IdIndividuo[200];
		scanf("%s",IdIndividuo);

		printf("Sexo: ");
		char Sexo[1];
		scanf("%s",Sexo);

		InserirIndividuo(IdEspecie,IdIndividuo,Sexo);
	}
	char captura[] = "Capturas";
	if (strcmp(tipo, captura) == 0) {
		printf("ID da Captura: ");
		char IdCaptura[200];
		scanf("%s",IdCaptura);

		printf("ID do Individuo: ");
		char IdIndividuo[200];
		scanf("%s",IdIndividuo);

		printf("Comprimento: ");
		char Comprimento[200];
		scanf("%s",Comprimento);

		printf("Largura: ");
		char Largura[200];
		scanf("%s",Largura);

		printf("Peso: ");
		char Peso[200];
		scanf("%s",Peso);

		printf("Data de captura: ");
		char DataCaptura[200];
		scanf("%s",DataCaptura);

		printf("Local de captura: ");
		char LocalCaptura[200];
		scanf("%s",LocalCaptura);

		InserirCaptura(IdCaptura, IdIndividuo, Comprimento, Largura, Peso, DataCaptura, LocalCaptura);
	}
}

int BuscarEspecie(char *id) {
	  FILE *arquivo;
	  char aux[50] = "", c=124;
	  int locPipe, comp, retorno = 0;
	  char LinhaBusca[500];
	  arquivo = fopen (_arquivoEspecies, "r");
	  rewind(arquivo);
	  while (1 == 1)
	  {
		  retorno = ftell(arquivo);
		  fgets(LinhaBusca, 500, arquivo);
		  locPipe = ((LinhaBusca-strchr(LinhaBusca, c)) * -1);

		  strncpy(aux, LinhaBusca+0, locPipe);
		  comp = strcmp(aux, id);
		  if (comp == 0) {
			  break;
		  }
		  if (feof(arquivo)) {
			  retorno = -1;
			  break;
		  }
	  }
	  fclose(arquivo);
	  return retorno;
}

void VerificarRegistroEspecieEncontrado(char *id) {
	if (BuscarEspecie(id) == -1) {
		printf("Registro nao encontrado!\n");
		system("Pause");
	} else {
		printf("Registro encontrado!\n");
		system("Pause");
	}
}

int BuscarIndividuo(char *id){
	  FILE *arquivo;
	  int  comp, retorno = 0;
	  char LinhaBusca[500];
	  char *resultado;
	  arquivo = fopen(_arquivoIndividuos,"r");
	  rewind(arquivo);
	  while (0 == 0){
		 retorno = ftell(arquivo);
		 fgets(LinhaBusca, 500, arquivo);
		 resultado = strtok(LinhaBusca,"|");
         resultado = strtok(NULL,"|");
         retorno = ftell(arquivo);
		 comp = strcmp(resultado, id);
		 if (comp == 0) {
		   break;
		 }
		 if (feof(arquivo)) {
		   retorno = -1;
		   break;
		 }
	}
	fclose(arquivo);
	return retorno;
}

void VerificarRegistroIndividuoEncontrado(char *id){
	if (BuscarIndividuo(id) == -1) {
			printf("Registro nao encontrado!\n");
			system("Pause");
		} else {
			printf("Registro encontrado!\n");
			system("Pause");
		}
}

int BuscarCaptura(char *id) {
	FILE *arquivo;
	int  comp, retorno = 0;
	char LinhaBusca[500];
	char *resultado;
	arquivo = fopen(_arquivoCapturas,"r");
	rewind(arquivo);
	while (0 == 0){
		retorno = ftell(arquivo);
		fgets(LinhaBusca, 500, arquivo);
		resultado = strtok(LinhaBusca,"|");
        resultado = strtok(NULL,"|");
		comp = strcmp(resultado, id);
		if (comp == 0) {
			break;
		}
		if (feof(arquivo)) {
			retorno = -1;
			break;
		}
	}
	fclose(arquivo);
	return retorno;
}

void VerificarRegistroCapturaEncontrado(char *id){
	if (BuscarCaptura(id) == -1) {
			printf("Registro nao encontrado!\n");
			system("Pause");
		} else {
			printf("Registro encontrado!\n");
			system("Pause");
		}
}

void Buscar(char *tipo) {
	system("cls");
		printf("---------------------------------------------------\n");
		printf("  ********* Buscar %s *********\n", tipo);
		printf("---------------------------------------------------\n");
		char especie[] = "Especies";
		if (strcmp(tipo, especie) == 0) {
			printf("ID: ");
			char idEspecie[200];
			scanf("%s",idEspecie);

			VerificarRegistroEspecieEncontrado(idEspecie);
		}
		char individuo[] = "Individuos";
		if (strcmp(tipo, individuo) == 0) {
			printf("ID do Individuo: ");
			char IdIndividuo[200];
			scanf("%s",IdIndividuo);

			VerificarRegistroIndividuoEncontrado(IdIndividuo);
		}
		char captura[] = "Capturas";
		if (strcmp(tipo, captura) == 0) {
			printf("ID do Individuo: ");
			char IdIndividuo[200];
			scanf("%s",IdIndividuo);

			VerificarRegistroCapturaEncontrado(IdIndividuo);
		}
}

void RemoverEspecie(int rrn) {
	FILE *arquivo;
	arquivo = fopen(_arquivoEspecies,"r+");
	fseek(arquivo, rrn,SEEK_SET);
	fputs("*", arquivo);
	fclose(arquivo);
}

void RemoverIndividuo(int rrn){
	FILE *arquivo;
	arquivo = fopen(_arquivoIndividuos,"r+");
	rrn = (rrn - 5);
	fseek(arquivo, rrn,SEEK_SET);
	fputs("*", arquivo);
	fclose(arquivo);
}
void Remover(char *tipo) {
	system("cls");
	printf("---------------------------------------------------\n");
	printf("  ********* Remover %s *********\n", tipo);
	printf("---------------------------------------------------\n");
	char especie[] = "Especies";
		if (strcmp(tipo, especie) == 0) {
			printf("ID: ");
			char idEspecie[200];
			scanf("%s",idEspecie);
			int rrnEncontrado = BuscarEspecie(idEspecie);
			if (rrnEncontrado != 0) {
				RemoverEspecie(rrnEncontrado);
				printf("Registro removido com sucesso!");
				system("Pause");
			} else {
				printf("Nao foi possivel remover. Registro nao encontrado!");
			}
		}
		char individuo[] = "Individuos";
     		if (strcmp(tipo, individuo) == 0) {
	    		printf("ID: ");
		    	char idIndividuo[200];
				scanf("%s",idIndividuo);
				int rrnEncontrado = BuscarIndividuo(idIndividuo);
				if (rrnEncontrado != 0) {
				  RemoverIndividuo(rrnEncontrado);
				  printf("Registro removido com sucesso!");
				  system("Pause");
				} else {
				  printf("Nao foi possivel remover. Registro nao encontrado!");
			      }
		}
		char captura[] = "Capturas";
		if (strcmp(tipo, captura) == 0) {
		}
}

void MenuCadastros (char *tipo) {
	system("cls");
	printf("---------------------------------------------------\n");
	printf("  ********* Cadastro de %s *********\n", tipo);
	printf("---------------------------------------------------\n");
	printf("|  1 - Inserir                                    |\n");
	printf("|  2 - Buscar                                     |\n");
	printf("|  3 - Excluir                                    |\n");
	printf("---------------------------------------------------\n");
	printf(" Digite a Opcao desejada: ");
	int opcao = getch();

	switch(opcao) {
	case 49:
		Inserir(tipo);
		break;
	case 50:
		Buscar(tipo);
		break;
	case 51:
		Remover(tipo);
		break;
	}
}

void MenuConsultas () {
	system("cls");
	printf("---------------------------------------------------\n");
	printf("  ********* Consultas ********\n");
	printf("---------------------------------------------------\n");
	printf("|  1 - Historico de Monitoramento(Por individuo)  |\n");
	printf("|  2 - Historico de Monitoramento(Por especie)    |\n");
	printf("|  3 - Ultima captura do individuo                |\n");
	printf("---------------------------------------------------\n");
	printf(" Digite a Opcao desejada: ");
	int opcao = getch();

		switch(opcao) {
		case 49:
			printf("\n");
			printf("ID do Individuo: ");
			char IdIndividuo[200];
			scanf("%s",IdIndividuo);
			MonitoramentoIndividuo(IdIndividuo);
			break;
		case 50:
			//Buscar(opcao);
			break;
		case 51:
			printf("\n");
			printf("ID do Individuo: ");
			char IdInd[200];
			scanf("%s",IdInd);
			UltimaCapturaIndividuo(IdInd);
			break;
		}

}

void UltimaCapturaIndividuo(char *id){
    FILE *arquivo;
	int  comp, retorno = 0;
	char LinhaBusca[500];
	char IdInd[50];
	char Comprimento[50];
	char Largura[50];
	char Peso[50];
	char Data[100];
	char Local[100];
	char *resultado;
	arquivo = fopen(_arquivoCapturas,"r");
	rewind(arquivo);
	while (!feof(arquivo)){
	  fgets(LinhaBusca, 500, arquivo);
	  resultado = strtok(LinhaBusca,"|");
	  resultado = strtok(NULL,"|");
	  comp = strcmp(resultado, id);
	  if (comp == 0) {
		  while (resultado != NULL){
			  IdInd[0] = *resultado;
			  resultado = strtok(NULL,"|");
			  Comprimento[50] = *resultado;
			  resultado = strtok(NULL,"|");
			  Largura[50] = *resultado;
			  resultado = strtok(NULL,"|");
			  Peso[50] = *resultado;
			  resultado = strtok(NULL,"|");
			  Data[100] = *resultado;
			  resultado = strtok(NULL,"|");
			  Local[100] = *resultado;
			  resultado = strtok(NULL,"|");
		  }
        }
	}
	  printf("\n");
	  printf("Id Individuo = %s\n",IdInd);
	  printf("Comprimento = %s\n",Comprimento);
	  printf("Largura = %s\n",Largura);
	  printf("Peso = %s\n",Peso);
	  printf("Data = %s \n",Data);
	  printf("Local = %s \n",Local);
	  printf("\n");
	  system("pause");
	fclose(arquivo);
	MenuPrincipal();
}



void MonitoramentoIndividuo(char *id){

		FILE *arquivo;
		int  comp, retorno = 0;
		char LinhaBusca[500];
		char *resultado;
		arquivo = fopen(_arquivoCapturas,"r");
		rewind(arquivo);
		while (!feof(arquivo)){
		  fgets(LinhaBusca, 500, arquivo);
		  resultado = strtok(LinhaBusca,"|");
		  resultado = strtok(NULL,"|");
		  comp = strcmp(resultado, id);
		  if (comp == 0) {
			  while (resultado != NULL){
				  printf("Id Individuo = %s\n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("Comprimento = %s\n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("Largura = %s\n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("Peso = %s\n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("Data = %s \n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("Local = %s \n",resultado);
				  resultado = strtok(NULL,"|");
				  printf("\n");
			  }

		  }
		}
		system("pause");
		fclose(arquivo);
		MenuPrincipal();
}


void ImportarDados(int tipo, char *localArquivo) {
	char campo[500], c;
	char novoRegistro[1000];
	//int  comp;
	FILE *arquivoImportado, *arquivoCaptura;
	arquivoImportado = fopen (localArquivo, "r");
	if (tipo == 1) {
		arquivoCaptura = fopen(_arquivoCapturas, "w");
	} else {
		arquivoCaptura = fopen(_arquivoCapturas, "a");
	}
	rewind(arquivoImportado);
	int teste = 1;
	while (1 == 1)
	{
		teste++;
		strcpy(campo, "");
		strcpy(novoRegistro, "\n");
		while (1 == 1) {
			fgets(campo, 500, arquivoImportado);
			if (strcmp(campo, "#\n") == 0) {
				printf("%s", campo);
				system("Pause");
				break;
			}
			str_replace(campo);
			strcat(novoRegistro, campo);
			strcat(novoRegistro, "|");
		}
		fputs(novoRegistro, arquivoCaptura);
		if (feof(arquivoImportado)) {
			break;
		}
		if (teste == 4) {
			break;
		}
	}
	fclose(arquivoImportado);
	fclose(arquivoCaptura);
	printf("Importacao realizada com sucesso!\n");
	system("Pause");
}

void MenuImportacao () {
	system("cls");
	printf("--------------------------------------------\n");
	printf("  ********* Importacoes *********\n");
	printf("--------------------------------------------\n");
	printf("|  1 - Adicinar dados ao arquivo existente |\n");
	printf("|  2 - Reescrever arquivo de dados         |\n");
	printf("--------------------------------------------\n");
	printf("Informe o local do arquivo: ");
	char caminho[200];
	scanf("%s",caminho);

	printf("Digite a Opcao desejada: ");

	int opcao = getch();

	switch(opcao) {
	case 49:
		ImportarDados(2, caminho);
		break;
	case 50:
		ImportarDados(1, caminho);
		break;
	}
}

void MenuPrincipal (void) {
	system("cls");
	printf("---------------------------------------------------\n");
	printf("  *********** Menu Principal ***********\n");
	printf("---------------------------------------------------\n");
	printf("|  1 - Cadastro de Especies                       |\n");
	printf("|  2 - Cadastro de Individuos                     |\n");
	printf("|  3 - Cadastro de Capturas                       |\n");
	printf("|  4 - Consultas                                  |\n");
	printf("|  5 - Importacao de Dados                        |\n");
	printf("---------------------------------------------------\n");
	printf(" Digite a Opcao desejada: ");

	int opcao = getch();
		switch(opcao) {
		case 49:
			MenuCadastros("Especies");
			break;
		case 50:
			MenuCadastros("Individuos");
			break;
		case 51:
			MenuCadastros("Capturas");
			break;
		case 52:
			MenuConsultas();
			break;
		case 53:
			MenuImportacao();
			break;
		}
}

void CriarArquivo(char *arquivo)
{
	int aux;
	FILE *arq;
	arq = fopen(arquivo, "a");
	fseek(arq,0,SEEK_END);
	aux = ftell(arq);
	if (aux == 0) {fputs("-1\n", arq);}
	fclose(arq);
}

int main (void) {
	CriarArquivo(_arquivoCapturas);
	CriarArquivo(_arquivoEspecies);
	CriarArquivo(_arquivoIndividuos);
	MenuPrincipal();
	return 0;
}
